package com.pizza.abstrait;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;

import javax.faces.context.FacesContext;

import com.pizza.control.CommandeBean;
import com.pizza.model.Remise;

/**
 * Class AbstractCommande, classe abstraite rassemblant toutes les informations d'une commande
 *
 */
public class AbstractCommande implements Serializable {

	protected int id;
	protected AbstractClient client;
	protected Remise remise;
	
	protected float total;
	protected String etat;
	protected float tva;
	protected Date date;
	protected boolean livraison;
	protected AbstractAdresse adresseLivraison;
	protected ArrayList<AbstractCommandeLignePizza> pizzas;
	protected ArrayList<AbstractCommandeLigneArticle> articles;
	protected ArrayList<AbstractCommandeLigneFormule> formules;
	
	protected String descriptionArticles;
	
	public ArrayList<AbstractCommandeLigneArticle> getArticles() {
		return articles;
	}

	public void setArticles(ArrayList<AbstractCommandeLigneArticle> articles) {
		this.articles = articles;
	}
	
	public boolean addArticle(AbstractCommandeLigneArticle article) {
		return this.articles.add(article);
	}
	
	public boolean removeArticle(AbstractCommandeLigneArticle article) {
		return this.articles.remove(article);
	}

	public AbstractClient getClient() {
		return client;
	}

	public void setClient(AbstractClient client) {
		this.client = client;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public String getEtat() {
		return etat;
	}

	public void setEtat(String etat) {
		this.etat = etat;
	}

	public ArrayList<AbstractCommandeLigneFormule> getFormules() {
		return formules;
	}

	public void setFormules(ArrayList<AbstractCommandeLigneFormule> formules) {
		this.formules = formules;
	}
	
	public boolean addFormule(AbstractCommandeLigneFormule formule) {
		return this.formules.add(formule);
	}
	
	public boolean removeFormule(AbstractCommandeLigneFormule formule) {
		return this.formules.remove(formule);
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public boolean isLivraison() {
		return livraison;
	}

	public void setLivraison(boolean livraison) {
		this.livraison = livraison;
	}

	public ArrayList<AbstractCommandeLignePizza> getPizzas() {
		return pizzas;
	}

	public void setPizzas(ArrayList<AbstractCommandeLignePizza> pizzas) {
		this.pizzas = pizzas;
	}
	
	public boolean addPizza(AbstractCommandeLignePizza pizza) {
		return this.pizzas.add(pizza);
	}
	
	public boolean removePizza(AbstractCommandeLignePizza pizza) {
		return this.pizzas.remove(pizza);
	}

	public Remise getRemise() {
		return remise;
	}

	public void setRemise(Remise remise) {
		this.remise = remise;
	}

	public float getTotal() {
		total = 0;
		for(int i=0; i < pizzas.size(); i++){
			total += pizzas.get(i).getPrix();
		}
		for(int i=0; i < articles.size(); i++){
			total += articles.get(i).getPrix();
		}
		for(int i=0; i < formules.size(); i++){
			total += formules.get(i).getPrix();
		}
		Remise remise = getRemise();
		if(remise != null) {
			total -= remise.getMontant();
		}
		return total;
	}

	public void setTotal(float total) {
		this.total = total;
	}

	public float getTva() {
		return tva;
	}

	public void setTva(float tva) {
		this.tva = tva;
	}

	public AbstractAdresse getAdresseLivraison() {
		return adresseLivraison;
	}

	public void setAdresseLivraison(AbstractAdresse adresseLivraison) {
		this.adresseLivraison = adresseLivraison;
	}
	
	public String getDescriptionArticles() {
		String descriptionArticles= "";
		for(int i=0; i < getPizzas().size(); i++){
			descriptionArticles += getPizzas().get(i).getQuantite()+" X "+getPizzas().get(i).getPizza().getNom()+" ("+getPizzas().get(i).getDiametre().getNbPersonnes()+" p.), ";
		}
		for(int i=0; i < getArticles().size(); i++){
			descriptionArticles += getArticles().get(i).getQuantite()+" X "+getArticles().get(i).getArticle().getNom()+", ";
		}
		
		return descriptionArticles;
	}

	public void setDescriptionArticles(String descriptionArticles) {
		this.descriptionArticles = descriptionArticles;
	}
	
	public void recommander() {
		FacesContext context = FacesContext.getCurrentInstance();
		CommandeBean commande = (CommandeBean) context.getExternalContext()
		.getSessionMap().get("commandeBean");
		
		if(commande != null) {
			commande.initialiserCommande();
			commande.setEtape(1);
			
			for(int i=0; i < getPizzas().size(); i++){
				for(int j=0; j < getPizzas().get(i).getQuantite(); j++) {
					commande.ajouterPizzaPanier(getPizzas().get(i).getPizza(), getPizzas().get(i).getDiametre());
				}
			}
			for(int i=0; i < getArticles().size(); i++){
				for(int j=0; j < getArticles().get(i).getQuantite(); j++) {
					commande.ajouterArticlePanier(getArticles().get(i).getArticle());
				}
			}
		}
		
		
	}
	
}
